package com.elvis.singleton;

/**
 *  通过静态内部类可以安全地创建懒加载的单例，不存在线程安全问题
 *
 *  在Java的各个版本中，这种方式都能正确的实现类的懒加载
 *  这种方式充分利用了Java语言类初始化的特性，因此可以正确的工作在任何编译器和虚拟机上
 *
 *  内部类是延时加载的，因此只有在调用getInstance()方法的时候才会初始化内部类，
 *  这是种线程安全的方式，不需要特殊的语言结构(比如volatile 或 synchronized)
 */
public final class InitializingOnDemandHolderIdiom {

    /**
     * 私有构造器，防止实例化该类(反射和序列化可以破坏单例)
     */
    private InitializingOnDemandHolderIdiom() {}

    /**
     *
     * @return 返回类的单例
     */
    public static InitializingOnDemandHolderIdiom getInstance() {
        return HelperHolder.INSTANCE;
    }

    /**
     * 通过静态内部类实现单例的懒加载
     *
     * 静态内部类初始化不是跟随外部类初始化时初始化，而是真正使用的时候才会初始化
     */
    private static class HelperHolder {
        private static InitializingOnDemandHolderIdiom INSTANCE =
                new InitializingOnDemandHolderIdiom();
    }
}
